﻿using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Text;

namespace TbDataSync
{
    /// <summary>
    /// 入口点
    /// </summary>
    public partial class Program
    {
        ~Program()
        {
            old_client.Dispose();
            new_client.Dispose();
            sw.Close(); sw.Dispose();
            fs.Close(); fs.Dispose();
        }


        static void Main(string[] args)
        {
            RegistListenerOfExit();
            Banner();
            Login();
            SyncData();
        }

        public static void SyncData()
        {
            //分页获取设备 device_list 

            var page = 0;//572 195
            var rows = 100;
            var url = urls["device_list"].Replace("%rows%", $"{rows}").Replace("%page%", $"{page}");
            var getResp = old_client.GetAsync(url).Result;
            Log.Info($"设备列表请求开始 页数:{page} 行数:{rows}");
            if (getResp.StatusCode == System.Net.HttpStatusCode.OK)
            {
                var getContent = getResp.Content.ReadAsStringAsync().Result;
                var getResult = JsonConvert.DeserializeObject<DeviceInfo>(getContent);

                var totalPage = getResult.totalPages;

                while (page < totalPage)
                {
                    url = urls["device_list"].Replace("%rows%", $"{rows}").Replace("%page%", $"{page}");
                    Log.Info($"设备列表请求 页数:{page}/{totalPage} 行数:{rows}");
                    getResp = old_client.GetAsync(url).Result;
                    getContent = getResp.Content.ReadAsStringAsync().Result;
                    getResult = JsonConvert.DeserializeObject<DeviceInfo>(getContent);
                    totalPage = getResult.totalPages;
                    getResult.data.ForEach(item =>
                    {
                        //TODO 这里先过滤掉鲁开头的，可以删掉这个条件
                        if (!item.name.StartsWith("鲁"))
                        {
                            //新地址创建新设备，并获取设备id
                            var newDeviceId = AddDevice(item.name, item.label);
                            if (!string.IsNullOrEmpty(newDeviceId))
                            {
                                //从旧设备中提取属性数据
                                var content = GetAttr(item.id.id);
                                if (content != null)
                                {
                                    //将属性信息 发送到 新地址的新设备
                                    PushAttr(newDeviceId, content);

                                    //从旧设备中提取遥测数据 发送到 新地址的新设备
                                    TransferTimeseries(item.id.id, newDeviceId);
                                }
                            }

                        }
                    });

                    Wait();
                    //下一页
                    page++;
                }

            }
            else
            {
                Log.Info("设备列表请求失败，重新发起");
                Login();
                SyncData();
            }

        }


    }
}
